package edu.uoc.tds.pec4.vista;

import edu.uoc.tds.pec4.model.SS4_Acceso;
import edu.uoc.tds.pec4.util.ExceptionUtils;
import java.awt.BorderLayout;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import edu.uoc.tds.pec4.util.LanguageUtils;
import edu.uoc.tds.pec4.vista.base.JPanelBase;
import java.rmi.RemoteException;
import javax.swing.JPasswordField;

/**
 * Tecnicas de Desarrollo de Software - (UOC)
 * Clase para visualizar la pantalla de cambio de contraseña
 * @author Pedro Bauzá Picó
 * @version 1.0
 */
public class SS4_PantallaCambioContrasenya extends JPanelBase {

    private SS4_PantallaMenu SS4_PantallaMenu;
    private JLabel jlabel_NombreUsuario;
    private JLabel jlabel_Contrasenya;
    private JLabel jlabel_Contrasenya_Repetir1;
    private JLabel jlabel_Contrasenya_Repetir2;
    private JTextField jtextfield_NombreUsuario;
    private JPasswordField jpasswordField_Contrasenya;
    private JPasswordField jpasswordField_Contrasenya_Repetir1;
    private JPasswordField jpasswordField_Contrasenya_Repetir2;
    private JButton jbutton_Aceptar;
    private JButton jbutton_Cancelar;
    private JPanel panelCentral;
    private SS4_Acceso acceso;

    public SS4_PantallaCambioContrasenya(SS4_PantallaMenu SS4_PantallaMenu) {
        super();
        this.SS4_PantallaMenu = SS4_PantallaMenu;
        this.acceso = SS4_PantallaMenu.getAcceso();
        iniciarComponentes();
    }

    /*
     * Método para iniciar los componentes que contiene la pantalla
     */
    private void iniciarComponentes() {
        jlabel_NombreUsuario = new JLabel(LanguageUtils.getMessage("CambioContrasenya.jlabel_NombreUsuario.titulo"));
        jlabel_NombreUsuario.setBounds(new Rectangle(190, 80, 176, 25));
        jtextfield_NombreUsuario = new JTextField();
        jtextfield_NombreUsuario.setBounds(new Rectangle(340, 80, 176, 25));
        jtextfield_NombreUsuario.setText("");
        jlabel_Contrasenya = new JLabel(LanguageUtils.getMessage("CambioContrasenya.jlabel_Contrasenya.titulo"));
        jlabel_Contrasenya.setBounds(new Rectangle(190, 140, 176, 25));
        jpasswordField_Contrasenya = new JPasswordField();
        jpasswordField_Contrasenya.setBounds(new Rectangle(340, 140, 176, 25));
        jpasswordField_Contrasenya.setText("");
        jlabel_Contrasenya_Repetir1 = new JLabel(LanguageUtils.getMessage("CambioContrasenya.jlabel_Contrasenya_Repetir1.titulo"));
        jlabel_Contrasenya_Repetir1.setBounds(new Rectangle(190, 200, 176, 25));
        jpasswordField_Contrasenya_Repetir1 = new JPasswordField();
        jpasswordField_Contrasenya_Repetir1.setBounds(new Rectangle(340, 200, 176, 25));
        jpasswordField_Contrasenya_Repetir1.setText("");
        jlabel_Contrasenya_Repetir2 = new JLabel(LanguageUtils.getMessage("CambioContrasenya.jlabel_Contrasenya_Repetir2.titulo"));
        jlabel_Contrasenya_Repetir2.setBounds(new Rectangle(190, 260, 176, 25));
        jpasswordField_Contrasenya_Repetir2 = new JPasswordField();
        jpasswordField_Contrasenya_Repetir2.setBounds(new Rectangle(340, 260, 176, 25));
        jpasswordField_Contrasenya_Repetir2.setText("");
        jbutton_Aceptar = new JButton();
        jbutton_Aceptar.setText(LanguageUtils.getMessage("CambioContrasenya.jbutton_Aceptar.titulo"));
        jbutton_Aceptar.setName("jbutton_Aceptar");
        jbutton_Aceptar.setBounds(new Rectangle(190, 320, 150, 25));
        jbutton_Cancelar = new JButton();
        jbutton_Cancelar.setText(LanguageUtils.getMessage("CambioContrasenya.jbutton_Cancelar.titulo"));
        jbutton_Cancelar.setName("jbutton_Cancelar");
        jbutton_Cancelar.setBounds(new Rectangle(365, 320, 150, 25));
        jbutton_Aceptar.addActionListener(SS4_PantallaMenu);
        jbutton_Cancelar.addActionListener(SS4_PantallaMenu);

        setLayout(new BorderLayout());
        panelCentral = new JPanel();
        panelCentral.setLayout(null);
        panelCentral.add(jlabel_NombreUsuario);
        panelCentral.add(jtextfield_NombreUsuario);
        panelCentral.add(jlabel_Contrasenya);
        panelCentral.add(jpasswordField_Contrasenya);
        panelCentral.add(jlabel_Contrasenya_Repetir1);
        panelCentral.add(jpasswordField_Contrasenya_Repetir1);
        panelCentral.add(jlabel_Contrasenya_Repetir2);
        panelCentral.add(jpasswordField_Contrasenya_Repetir2);
        panelCentral.add(jbutton_Aceptar);
        panelCentral.add(jbutton_Cancelar);
        add(panelCentral, BorderLayout.CENTER);
    }

    /**
     * Acción que se ejecutará al pulsar el botón
     * @param  Nombre del boton que se ha pulsado
     */
    public void componentePulsado(ActionEvent e) {
        if (e.getSource() == jbutton_Aceptar) {
            cambiarContrasenya();
        } else if (e.getSource() == jbutton_Cancelar) {
            SS4_PantallaMenu.setPanelCentral(new SS4_PanelInicial());
        }
    }

    /*
     * Metodo que comprueba si el usuario tiene acceso
     */
    private void cambiarContrasenya() {
        String validarCamposObligatoriosMessage = validarCamposObligatorios(jtextfield_NombreUsuario.getText(), jpasswordField_Contrasenya.getText(), jpasswordField_Contrasenya_Repetir1.getText(), jpasswordField_Contrasenya_Repetir2.getText());
        if ("".equals(validarCamposObligatoriosMessage)) {
            try {
                //Realizamos la operacion de cambio de contraseña
                int v_Tmp = this.SS4_PantallaMenu.getRemotoConexion().cambiarContrasenya(this.acceso.getCod_usuario(), jpasswordField_Contrasenya_Repetir1.getText());
                if (v_Tmp == 1) {
                    SS4_PantallaMenu.setPanelCentral(new SS4_PanelInicial());
                    ExceptionUtils.visualizarInformacion(LanguageUtils.getMessage("CambioContrasenya.Correcto"));
                } else {
                    ExceptionUtils.visualizarError(LanguageUtils.getMessage("CambioContrasenya.ERR_Actualizar"));
                }
            } catch (RemoteException ex) {
                ExceptionUtils.visualizarError(ExceptionUtils.ERR_Remote);
            } catch (Exception ex) {
                ExceptionUtils.visualizarError(LanguageUtils.getMessage("Acceso.ERR_Acceso"));
            }
        } else {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("Acceso.CamposObligatorios") + validarCamposObligatoriosMessage);
        }
    }

    /*
     * Metodo que comprueba que se han introducido los campos obligatorios
     */
    private String validarCamposObligatorios(String p_NombreUsuario, String p_Contrasenya, String p_ContrasenyaRepetir1, String p_ContrasenyaRepetir2) {
        StringBuilder campos = new StringBuilder();
        try {
            if (p_NombreUsuario == null || "".equals(p_NombreUsuario)) {
                campos.append(LanguageUtils.getMessage("Acceso.CampoObligatorio.NombreUsuario"));
            }
            if (p_Contrasenya == null || "".equals(p_Contrasenya)) {
                campos.append(LanguageUtils.getMessage("Acceso.CampoObligatorio.Contrasenya"));
            }
            if (p_ContrasenyaRepetir1 == null || "".equals(p_ContrasenyaRepetir1)) {
                campos.append(LanguageUtils.getMessage("CambioContrasenya.CampoObligatorio.ContrasenyaRepetir1"));
            }
            if (p_ContrasenyaRepetir2 == null || "".equals(p_ContrasenyaRepetir2)) {
                campos.append(LanguageUtils.getMessage("CambioContrasenya.CampoObligatorio.ContrasenyaRepetir2"));
            }
            //Devolvemos primero si hay errores por la falta de la introduccion de los valores en los campos
            if (campos.length() > 0) {
                return campos.toString();
            }

            //Luego seguiremos con validaciones mas especificas
            if (p_Contrasenya.equals(p_ContrasenyaRepetir1)) {
                campos.append(LanguageUtils.getMessage("CambioContrasenya.CampoObligatorio.ContrasenyaRepetida"));
            }
            if (!p_ContrasenyaRepetir1.equals(p_ContrasenyaRepetir2)) {
                campos.append(LanguageUtils.getMessage("CambioContrasenya.CampoObligatorio.ContrasenyaNoCoincide"));
            }
            if (!p_NombreUsuario.equals(this.acceso.getLoguin())) {
                campos.append(LanguageUtils.getMessage("CambioContrasenya.CampoObligatorio.NombreIncorrecto"));
            }
            if (!p_Contrasenya.equals(this.acceso.getContrasenya())) {
                campos.append(LanguageUtils.getMessage("CambioContrasenya.CampoObligatorio.ContrasenyaIncorrecto"));
            }
        } catch (Exception e) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("CambioContrasenya.ERR_Validar"));
        }

        return campos.toString();
    }
}
